#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void handler(int sig)
{
    return;  //使得退出pause()
}

/*
    创建共享内存
    向共享内存写
    另一个进程来读
*/
int main(int argc, char *argv[])
{
    signal(SIGUSR1, handler);
    int shmid;
    int key;
    char *buff;
    int other_pid;
    
    //1.创建共享内存
    key = ftok(".", 1);
    shmid = shmget(key, 128, IPC_CREAT | 0777);

    //2.将内核中的共享内存映射到用户空间，第二个参数NULL表示系统自动分配用户空间地址
    //第三个参数0表示可读写
    buff = (char*)shmat(shmid, NULL, 0);
    if(buff == NULL){
        printf("映射共享内存失败\n");
        return -2;
    }

    //3.第一次向共享内存中写入自己的进程ID
    sprintf(buff, "%d", getpid());

    pause();  //等待另一个进程返回它的PID

    other_pid = atoi(buff);
    printf("已获取PID, %d\n", other_pid);

    //4.循环向共享内存写入数据
    while (1)
    {
        //写入数据到到共享内存，实际上向用户空间写就可以
        fgets(buff, 128, stdin);
        //发出信号，另一个进程读取共享内存
        kill(other_pid, SIGUSR2);  
        pause();
    }
    return 0;
} 




